데이터 거래란 무엇인가요?

거래·계약·실행 모듈을 구분하고, 언어가 달라도 일치해야 할 응답을 확인합니다.

QCN

HandStack에서 '거래'란?

  • 출발지와 도착지 간에 데이터를 주고받는 작업의 기본 단위를 의미합니다.

  • 다양한 시스템 구성 요소 간의 데이터 흐름을 '거래'라고 부릅니다.

    • 클라이언트에서 업무 서버로 데이터를 요청하고 응답받는 거래
    • 업무 서버에서 메시지 서버로 작업을 전달하는 거래
    • 메시지 서버에서 데이터베이스로 데이터를 CRUD하는 거래
    • 메시지 서버에서 외부 서비스 API를 호출하는 거래
QCN

거래를 위한 약속, '계약'

  • 화면에서 업무 거래를 위해 클라이언트와 서버는 약속된 규칙을 따라야 합니다.

  • 이 약속을 '계약(Contract)'이라고 부릅니다.

  • 계약에는 어떤 데이터를 주고받을 것인지(입력/출력 정보) 명확하게 정의되어 있습니다.

  • 계약은 transact 모듈의 업무와 dbclient, function, command 모듈의 기능으로 만들어집니다.

QCN

dbclient 모듈 주요 역할

  • transact 요청 정보로 SQL Server, Oracle, MySQL & MariaDB, PostgreSQL, SQLite 데이터베이스의 CRUD 쿼리를 수행합니다.
  • 목록·상세·등록·수정·삭제처럼 SQL로 표현할 업무를 담당합니다.
QCN

dbclient 모듈의 xml 기능 계약 파일 (1/2)

<?xml version="1.0" encoding="UTF-8"?>
<mapper xmlns="contract.xsd">
	<header>
		<application>HDS</application>
		<project>TST</project>
		<transaction>TST010</transaction>
		<datasource>DB01</datasource>
		<use>Y</use>
		<desc>사용자, 이메일, 연락처 2FA 인증 관리</desc>
	</header>
	<commands>
		<statement id="LD01" seq="0" use="Y" timeout="0" desc="인증 정보 조회">
			<![CDATA[
SELECT C.*
QCN

dbclient 모듈의 xml 기능 계약 파일 (2/2)

FROM   Certify C
WHERE  C.CertifiedYN = 'N'
	AND C.VerifyTarget = @VerifyTarget
	AND C.ExpiredAt > GETDATE();
			]]>
			<param id="@VerifyTarget" type="String" length="1" value="" />
		</statement>
	</commands>
</mapper>
QCN

function 모듈 주요 역할

  • transact 요청 정보로 C#, Node.js, Python 언어의 스크립트를 수행합니다.
  • 내외부 시스템 연동·배치·정기 작업 등 코드로 표현할 로직을 담당합니다.
QCN

function 모듈의 C# 기능 featureMain.cs 파일 (1/3)

namespace HDS.Function.TST
{
    public class CSF010
    {
        protected DataSet? GF01(List<DynamicParameter> dynamicParameters, DataContext dataContext)
        {
            string typeMember = "TST.CSF010.GF01";

            string serverDate = dynamicParameters.Value("ServerDate").ToStringSafe();
            string serverName = dynamicParameters.Value("ServerName").ToStringSafe();

            DataTableHelper dataTableBuilder = new DataTableHelper();
            dataTableBuilder.AddColumn("FunctionResult", typeof(string));
QCN

function 모듈의 C# 기능 featureMain.cs 파일 (2/3)


            dataTableBuilder.NewRow();
            dataTableBuilder.SetValue(0, 0, $"typeMember: {typeMember}, serverDate: {serverDate}, serverName: {serverName}");

            using DataSet result = new DataSet();
            using (DataTable table = dataTableBuilder.GetDataTable())
            {
                result.Tables.Add(table);
            }

            return result;
        }
    }
QCN

function 모듈의 C# 기능 featureMain.cs 파일 (3/3)

}
QCN

function 모듈의 Node.js 기능 featureMain.js 파일 (1/2)

var fs = require('fs');
var syn = require('syn');

module.exports = {
    GF01: (callback, moduleID, parameters, dataContext) => {
        var typeMember = "TST.JSF010.GF01";
        var serverDate = $array.getValue(parameters, 'ServerDate');
        var serverName = $array.getValue(parameters, 'ServerName');

        var result = {
            DataTable1: [
                {
                    FunctionResult: `typeMember: ${typeMember}, moduleID: ${moduleID},
                    serverDate: ${serverDate}, serverName: ${serverName}`
QCN

function 모듈의 Node.js 기능 featureMain.js 파일 (2/2)

                }
            ]
        };

        callback(null, result);
    }
}
QCN

function 모듈의 Python 기능 featureMain.py 파일 (1/2)

import json

class PYF010:
    def GF01(parameters, dataContext):
        print(parameters["GlobalID"])
        print(dataContext)

        dataDict = json.loads(dataContext)

        result = {
            "DataTable1": [
                {
                    "accessToken": dataDict["accessToken"],
                    "globalID": dataDict["globalID"],
QCN

function 모듈의 Python 기능 featureMain.py 파일 (2/2)

                    "environment": dataDict["environment"],
                    "platform": dataDict["platform"]
                }
            ]
        }

        return json.dumps(result, ensure_ascii=False, indent=4)
QCN

command 모듈 주요 역할

  • transact 요청 정보로 배치 스크립트 또는 bash 스크립트와 연계하여 운영체제 내에서 CLI 명령 프로그램을 수행합니다.
  • 안전한 대량의 배치 작업이나 외부 시스템과의 연동에 사용합니다.
  • 사용 중인 배포본의 계약 형식과 허용 명령을 확인합니다.
QCN

command 모듈의 xml 기능 계약 파일 (1/2)

<?xml version="1.0" encoding="UTF-8"?>
<mapper xmlns="contract.xsd">
    <header>
        <application>HDS</application>
        <project>TST</project>
        <transaction>TST010</transaction>
        <use>Y</use>
        <desc>command 모듈 계약 예제</desc>
    </header>
    <commands>
        <command id="GC01" seq="0" use="Y" timeout="30" desc="dotnet 런타임 정보 조회">
            <executable>dotnet</executable>
            <arguments>--info</arguments>
            <successExitCodes>0</successExitCodes>
QCN

command 모듈의 xml 기능 계약 파일 (2/2)

            <param id="@UserID" type="String" length="255" value="NULL" />
            <param id="@RoleID" type="String" length="100" value="NULL" />
        </command>
    </commands>
</mapper>
QCN

잠깐, 구분해 보기

업무 거래 한 번이 항상 하나의 DB 트랜잭션일까요?

QCN

데이터 응답 결과의 주요 특징

  • 예제는 언어가 달라도 행·열로 구성된 결과 테이블을 반환합니다.
  • 출력 테이블의 순서·필드·타입을 거래 계약과 맞춥니다.
  • 다른 ReturnType을 사용할 때는 해당 실행 모듈의 규칙을 따릅니다.
QCN

여러 데이터 거래 연동 (1/3)

...
"SequentialOption": [
    {
        "TransactionProjectID": "SMP",
        "TransactionID": "SMP010",
        "ServiceID": "GD04",
        "CommandType": "D",
        "ServiceInputFields": [ 0 ],
        "ServiceOutputs": [
            {
                "ModelID": "Dynamic",
                "Fields": [
                ],
                "Type": "Form"
QCN

여러 데이터 거래 연동 (2/3)

            }
        ],
        "ResultHandling": "FieldMapping",
        "TargetInputFields": [ 0 ],
        "ResultOutputFields": []
    },
    {
        "TransactionProjectID": "SMP",
        "TransactionID": "SMP010",
        "ServiceID": "IF01",
        "CommandType": "F",
        "ServiceInputFields": [ 0 ],
        "ServiceOutputs": [
            {
QCN

여러 데이터 거래 연동 (3/3)

                "ModelID": "Dynamic",
                "Fields": [
                ],
                "Type": "Form"
            }
        ],
        "ResultHandling": "ResultSet",
        "TargetInputFields": [],
        "ResultOutputFields": [ 0 ]
    }
],
...
QCN

거래를 설명하는 기준

  • 거래는 작업 단위, 계약은 입출력과 실행 대상의 약속입니다.
  • SQL은 dbclient, 코드 로직은 function, CLI는 command로 구분합니다.
  • 여러 호출을 연결할 때 결과 구조와 실패 처리 범위를 확인합니다.
QCN

발표: 첫 화면의 목표를 말한 뒤 핵심 개념과 예제로 진행합니다. 확인 질문 뒤에는 답할 시간을 주고, 마지막 완료 기준을 남겨 질문을 받습니다. 발표 구성 참고: MIT OpenCourseWare, Patrick Winston, How to Speak (2018), https://ocw.mit.edu/courses/res-tll-005-how-to-speak-january-iap-2018/pages/how-to-speak/

이어지는 코드 조각입니다. 앞뒤 페이지를 순서대로 읽으며 전체 예제의 일부임을 설명합니다.

이어지는 코드 조각입니다. 앞뒤 페이지를 순서대로 읽으며 전체 예제의 일부임을 설명합니다.

이어지는 코드 조각입니다. 앞뒤 페이지를 순서대로 읽으며 전체 예제의 일부임을 설명합니다.

이어지는 코드 조각입니다. 앞뒤 페이지를 순서대로 읽으며 전체 예제의 일부임을 설명합니다.

이어지는 코드 조각입니다. 앞뒤 페이지를 순서대로 읽으며 전체 예제의 일부임을 설명합니다.

이어지는 코드 조각입니다. 앞뒤 페이지를 순서대로 읽으며 전체 예제의 일부임을 설명합니다.

이어지는 코드 조각입니다. 앞뒤 페이지를 순서대로 읽으며 전체 예제의 일부임을 설명합니다.

이어지는 코드 조각입니다. 앞뒤 페이지를 순서대로 읽으며 전체 예제의 일부임을 설명합니다.

이어지는 코드 조각입니다. 앞뒤 페이지를 순서대로 읽으며 전체 예제의 일부임을 설명합니다.

이어지는 코드 조각입니다. 앞뒤 페이지를 순서대로 읽으며 전체 예제의 일부임을 설명합니다.

이어지는 코드 조각입니다. 앞뒤 페이지를 순서대로 읽으며 전체 예제의 일부임을 설명합니다.

질문 후 잠시 기다립니다. 답이 없으면 앞에서 본 예제를 다시 가리킵니다. 확인할 답: 업무 요청 단위와 DB 원자성 범위는 다릅니다. 실행 모듈과 트랜잭션 설정을 확인합니다. 다음 주제로 넘어가기 전에 차이를 청중의 표현으로 한 번 확인합니다.

이어지는 코드 조각입니다. 앞뒤 페이지를 순서대로 읽으며 전체 예제의 일부임을 설명합니다.

이어지는 코드 조각입니다. 앞뒤 페이지를 순서대로 읽으며 전체 예제의 일부임을 설명합니다.

이어지는 코드 조각입니다. 앞뒤 페이지를 순서대로 읽으며 전체 예제의 일부임을 설명합니다.

질문을 받는 동안 이 확인 기준을 화면에 남깁니다. 청중이 자신의 업무에 적용할 다음 행동 하나를 고르게 합니다.